package com.java.second_goods.service;

import com.java.second_goods.entity.Coupon;
import com.java.second_goods.entity.UserCoupon;

import java.math.BigDecimal;
import java.util.List;

/**
 * 优惠券 服务层
 */
public interface CouponService {
    /**
     * 查询优惠券信息
     *
     * @param id 优惠券ID
     * @return 优惠券信息
     */
    Coupon selectCouponById(Integer id);

    /**
     * 查询优惠券列表
     *
     * @param coupon 优惠券信息
     * @return 优惠券集合
     */
    List<Coupon> selectCouponList(Coupon coupon);

    /**
     * 查询有效的优惠券列表
     *
     * @return 优惠券列表
     */
    List<Coupon> selectValidCoupons();

    /**
     * 查询用户优惠券列表
     *
     * @param userId 用户ID
     * @return 用户优惠券列表
     */
    List<UserCoupon> selectUserCoupons(Integer userId);

    /**
     * 查询用户未使用的优惠券列表
     *
     * @param userId 用户ID
     * @return 用户优惠券列表
     */
    List<UserCoupon> selectUnusedUserCoupons(Integer userId);

    /**
     * 查询用户已使用的优惠券列表
     *
     * @param userId 用户ID
     * @return 用户优惠券列表
     */
    List<UserCoupon> selectUsedUserCoupons(Integer userId);

    /**
     * 查询可用的优惠券列表
     *
     * @param userId 用户ID
     * @param amount 消费金额
     * @return 优惠券列表
     */
    List<Coupon> selectAvailableCoupons(Integer userId, BigDecimal amount);

    /**
     * 新增优惠券
     *
     * @param coupon 优惠券信息
     * @return 结果
     */
    int insertCoupon(Coupon coupon);

    /**
     * 修改优惠券
     *
     * @param coupon 优惠券信息
     * @return 结果
     */
    int updateCoupon(Coupon coupon);

    /**
     * 删除优惠券信息
     *
     * @param id 优惠券ID
     * @return 结果
     */
    int deleteCouponById(Integer id);

    /**
     * 批量删除优惠券信息
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    int deleteCouponByIds(Integer[] ids);

    /**
     * 更新优惠券状态
     *
     * @param couponId 优惠券ID
     * @param status 状态
     * @return 结果
     */
    int updateCouponStatus(Integer couponId, Integer status);

    /**
     * 分配优惠券给用户
     *
     * @param couponId 优惠券ID
     * @param userId 用户ID
     * @return 结果
     */
    int assignCouponToUser(Integer couponId, Integer userId);

    /**
     * 使用优惠券
     *
     * @param userCouponId 用户优惠券ID
     * @param orderId 订单ID
     * @return 结果
     */
    int useCoupon(Integer userCouponId, String orderId);

    /**
     * 获取用户优惠券
     *
     * @param userCouponId 用户优惠券ID
     * @return 用户优惠券
     */
    UserCoupon selectUserCouponById(Integer userCouponId);
}